/*-------------------------------------------------------------------------
 *
 * pg_amop.h
 *	  “访问方法操作符”系统目录（pg_amop）的定义。
 *
 * amop 表标识与每个索引操作符族和操作符类相关的操作符。
 * 关联的操作符可以是搜索操作符或排序操作符，由
 * amoppurpose 标识。
 *
 * 此表的主键是 <amopfamily, amoplefttype, amoprighttype,
 * amopstrategy>。amoplefttype 和 amoprighttype 仅仅是操作符的
 * oprleft/oprright 的副本，即其声明的输入数据类型。
 * 对于特定 opclass 内的“默认”操作符，是那些具有
 * amoplefttype = amoprighttype = opclass 的 opcintype 的操作符。
 * opfamily 还可以包含其他操作符，通常是跨数据类型操作符。
 * 同一族中的所有操作符应该是兼容的，兼容性由每个单独的
 * 索引 AM 定义。
 *
 * 我们还在 <amopopr, amoppurpose, amopfamily> 上保留唯一索引，
 * 以便我们可以使用 syscache 快速回答“这个操作符是否在这个
 * opfamily 中，若是，它的语义是什么？”这样的问题。
 * 这意味着同一操作符不能在单个 opfamily 中列出多个策略号，
 * 除非同时列出其搜索和排序目的（对于这两种目的使用不同
 * 的策略号）。
 *
 * amopmethod 是拥有的 opfamily 的 opfmethod 字段的副本。
 * 这是目录的故意非规范化，以提高查找速度。
 *
 *
 * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
 * Portions Copyright (c) 1994, Regents of the University of California
 *
 * src/include/catalog/pg_amop.h
 *
 * NOTES
 *	  Catalog.pm 模块读取此文件并推导出模式信息。
 *
 *-------------------------------------------------------------------------
 */
#ifndef PG_AMOP_H
#define PG_AMOP_H

#include "catalog/genbki.h"
#include "catalog/pg_amop_d.h"

/* ----------------
 *		pg_amop 定义。 cpp 将其转换为
 *		typedef struct FormData_pg_amop
 * ----------------
 */
CATALOG(pg_amop,2602,AccessMethodOperatorRelationId)
{
	Oid			oid;			/* oid */

	/* 此条目的索引操作族 */
	Oid			amopfamily BKI_LOOKUP(pg_opfamily);

	/* 操作符的左输入数据类型 */
	Oid			amoplefttype BKI_LOOKUP(pg_type);

	/* 操作符的右输入数据类型 */
	Oid			amoprighttype BKI_LOOKUP(pg_type);

	/* 运算符策略编号 */
	int16		amopstrategy;

	/* 是 's'earch 还是 'o'rdering 的操作符？ */
	char		amoppurpose BKI_DEFAULT(s);

	/* 操作符的 pg_operator OID */
	Oid			amopopr BKI_LOOKUP(pg_operator);

	/* 此条目的索引访问方法 */
	Oid			amopmethod BKI_LOOKUP(pg_am);

	/* 排序操作族 OID，如果是搜索操作则为 0 */
	Oid			amopsortfamily BKI_DEFAULT(0) BKI_LOOKUP_OPT(pg_opfamily);
} FormData_pg_amop;

/* ----------------
 *		Form_pg_amop 对应于一个指向拥有
 *		pg_amop 关系格式的元组的指针。
 * ----------------
 */
typedef FormData_pg_amop *Form_pg_amop;

DECLARE_UNIQUE_INDEX(pg_amop_fam_strat_index, 2653, AccessMethodStrategyIndexId, on pg_amop using btree(amopfamily oid_ops, amoplefttype oid_ops, amoprighttype oid_ops, amopstrategy int2_ops));
DECLARE_UNIQUE_INDEX(pg_amop_opr_fam_index, 2654, AccessMethodOperatorIndexId, on pg_amop using btree(amopopr oid_ops, amoppurpose char_ops, amopfamily oid_ops));
DECLARE_UNIQUE_INDEX_PKEY(pg_amop_oid_index, 2756, AccessMethodOperatorOidIndexId, on pg_amop using btree(oid oid_ops));

#ifdef EXPOSE_TO_CLIENT_CODE

/* amoppurpose 的允许值： */
#define AMOP_SEARCH		's'		/* 运算符用于搜索 */
#define AMOP_ORDER		'o'		/* 运算符用于排序 */

#endif							/* EXPOSE_TO_CLIENT_CODE */

#endif							/* PG_AMOP_H */
